const express = require('express');
const fs = require('fs').promises;
const path = require('path');

const router = express.Router();

// 日志文件夹路径
const logDirPath = path.join(__dirname, '../../../logs');

/**
 * 获取当前周的文件名
 * @returns {string} - 日志文件名
 */
function getCurrentWeekLogFile() {
  const now = new Date();
  const startOfYear = new Date(now.getFullYear(), 0, 1);
  const daysSinceStart = Math.floor((now - startOfYear) / (24 * 60 * 60 * 1000));
  const weekNumber = Math.ceil((daysSinceStart + startOfYear.getDay() + 1) / 7);
  return `log_${now.getFullYear()}_W${weekNumber.toString().padStart(2, '0')}.json`;
}

/**
 * 确保日志目录存在
 */
async function ensureLogDirectory() {
  try {
    await fs.access(logDirPath);
  } catch (error) {
    // 如果目录不存在，创建它
    await fs.mkdir(logDirPath, { recursive: true });
  }
}

/**
 * 记录用户操作日志
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
router.post('/log', async (req, res) => {
  try {
    // 确保日志目录存在
    await ensureLogDirectory();
    
    // 获取客户端IP地址
    const clientIp = req.headers['x-forwarded-for'] || 
      req.connection.remoteAddress || 
      req.socket.remoteAddress ||
      (req.connection.socket ? req.connection.socket.remoteAddress : null);
    
    // 构造日志条目
    const logEntry = {
      timestamp: new Date().toISOString(),
      action: req.body.action,
      frequency: req.body.frequency || 1,
      terminal: req.body.terminal || req.headers['user-agent'],
      ip: clientIp,
      ...req.body // 包含其他可能的字段
    };

    // 获取当前周的日志文件路径
    const currentLogFile = getCurrentWeekLogFile();
    const logFilePath = path.join(logDirPath, currentLogFile);

    // 读取现有的日志数据
    let logs = [];
    try {
      const data = await fs.readFile(logFilePath, 'utf8');
      logs = JSON.parse(data);
    } catch (error) {
      // 如果文件不存在或解析失败，则从空数组开始
      logs = [];
    }

    // 添加新日志条目
    logs.push(logEntry);

    // 保存更新后的日志数据
    await fs.writeFile(logFilePath, JSON.stringify(logs, null, 2));

    res.status(200).json({ 
      success: true, 
      message: 'Log entry added successfully',
      data: logEntry
    });
  } catch (error) {
    console.error('Error saving log entry:', error);
    res.status(500).json({ 
      success: false, 
      message: 'Failed to save log entry',
      error: error.message 
    });
  }
});

/**
 * 获取所有日志数据（汇总所有周切片）
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
router.get('/logs', async (req, res) => {
  try {
    // 确保日志目录存在
    await ensureLogDirectory();
    
    // 读取日志目录中的所有文件
    const files = await fs.readdir(logDirPath);
    
    // 过滤出日志文件（以.log.json结尾的文件）
    const logFiles = files.filter(file => file.startsWith('log_') && file.endsWith('.json'));
    
    // 汇总所有日志文件的内容
    let allLogs = [];
    for (const file of logFiles) {
      try {
        const filePath = path.join(logDirPath, file);
        const data = await fs.readFile(filePath, 'utf8');
        const logs = JSON.parse(data);
        allLogs = allLogs.concat(logs);
      } catch (error) {
        console.error(`Error reading log file ${file}:`, error);
        // 即使某个文件读取失败，也继续处理其他文件
      }
    }
    
    // 按时间戳排序，最新的在前面
    allLogs.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp));
    
    res.status(200).json({
      success: true,
      data: allLogs
    });
  } catch (error) {
    if (error.code === 'ENOENT') {
      // 如果目录不存在，返回空数组
      res.status(200).json({
        success: true,
        message: 'No logs found',
        data: []
      });
    } else {
      console.error('Error reading logs:', error);
      res.status(500).json({
        success: false,
        message: 'Failed to read logs',
        error: error.message
      });
    }
  }
});

module.exports = router;